package com.basker.pisces.core.meta.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import com.basker.pisces.core.IDataContract;
import com.basker.pisces.core.meta.IDataObjectMeta;
import com.basker.pisces.core.meta.bean.BeanMeta;

/**
 * 元数据的标记，作用于Class。通过标记，Class对象对应生成一个{@linkplain IDataObjectMeta}实例。
 *
 * @author hangwen
 * @see BeanMeta
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(value = {ElementType.TYPE})
@Inherited
public @interface DataObjectMeta {

    /**
     * 显示名称
     *
     * @return
     * @see IDataObjectMeta#getDisplayName()
     */
    String displayName() default "";

    /**
     * 是否生成DataContract增强类
     *
     * <p>
     * 通过{@link IDataObjectMeta#createDataObject()}创建对象时，指示是否创建增强类，增加类是当前类的子类，并实现{@link IDataContract}接口
     *
     * @return
     */
    boolean generateDataContractClass() default true;

    /**
     * 是否只读
     *
     * @return
     * @see IDataObjectMeta#isReadOnly()
     */
    boolean isReadOnly() default false;

    /**
     * 名称
     *
     * @return
     * @see IDataObjectMeta#getName()
     */
    String name() default "";

    /**
     * 映射数据表所属的数据源，为空表示默认数据源,可以使用${xxx}的方式，该值会从配置文件获取
     *
     * @return
     * @see IDataObjectMeta#getSchema()
     */
    String schema() default "";

    /**
     * 一对一扩展表
     *
     * @return
     */
    String[] subTableNames() default {};

    /**
     * 映射的数据表名
     * <p>
     * 需要数据库持久化时，设置此属性
     *
     * @return
     * @see IDataObjectMeta#getTableName()
     */
    String tableName() default "";
}
